# -*- coding: utf-8 -*-
import os

from skimage import io
from skimage.color.colorconv import rgba2rgb, rgb2gray
from skimage.feature import match_template
import numpy as np
from common.report_add_img import add_img_path_2_report
from common.tools import get_project_path, sep, get_now_date_time_str
import cv2


class FindImg:
    def img_imread(self, img_path):
        """读取图像（返回 numpy 数组）
        :param img_path:图片路径
        """
        return io.imread(img_path, as_gray=True)

    def get_confidence(self, source_path, search_path):
        """模板匹配并返回可信度
        :param source_path: 源图像路径（大图）
        :param search_path: 搜索图像路径（模板小图）
        """
        # 使用 skimage 读取图像（RGB 顺序）
        img_src = io.imread(source_path)
        img_sch = io.imread(search_path)

        # 确保图像是 uint8 类型（0-255 范围）
        if img_src.dtype != np.uint8:
            img_src = (img_src * 255).astype(np.uint8)
        if img_sch.dtype != np.uint8:
            img_sch = (img_sch * 255).astype(np.uint8)

        # 检查尺寸
        if img_sch.shape[0] > img_src.shape[0] or img_sch.shape[1] > img_src.shape[1]:
            raise ValueError("模板图尺寸大于原图")

        # 转换为 BGR 格式（OpenCV 默认格式）
        img_src_bgr = cv2.cvtColor(img_src, cv2.COLOR_RGB2BGR)
        img_sch_bgr = cv2.cvtColor(img_sch, cv2.COLOR_RGB2BGR)

        # 使用 OpenCV 进行模板匹配（移除了 skimage 的 match_template）
        result = cv2.matchTemplate(img_src_bgr, img_sch_bgr, cv2.TM_CCOEFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

        # 获取最佳匹配位置
        top_left = max_loc
        h, w = img_sch_bgr.shape[:2]  # 使用 BGR 图像的高度和宽度
        bottom_right = (top_left[0] + w, top_left[1] + h)

        # 在 BGR 图像上绘制矩形（红色：BGR 顺序为 (0, 0, 255)）
        cv2.rectangle(img_src_bgr, top_left, bottom_right, (0, 0, 255), 2)

        # 保存图像
        diff_img_path = get_project_path() + sep(
            ["common", "img", "diff_img", get_now_date_time_str() + "-对比的图.png"],
            add_sep_before=True)

        # 确保目录存在
        os.makedirs(os.path.dirname(diff_img_path), exist_ok=True)

        # 保存图像（支持中文路径）
        cv2.imencode(".png", img_src_bgr)[1].tofile(diff_img_path)
        add_img_path_2_report(diff_img_path, "查找到的图")

        confidence = float(max_val)  # 直接使用 OpenCV 返回的最大值作为匹配度
        # confidence = float(np.max(confidence_result))
        return confidence


if __name__ == '__main__':
    source_path = get_project_path() + sep(["common", "img", "source_img",
                                            "source-avatar_img2.jpg"], add_sep_before=True)
    search_path = get_project_path() + sep(["common", "img", "avatar_img3.png"], add_sep_before=True)
    print("原图路径：", source_path)
    print("模板路径：", search_path)
    try:
        confidence = FindImg().get_confidence(source_path, search_path)
        print(f"匹配可信度：{confidence:.4f}")  # 例如：0.9876 表示匹配度98.76%
    except Exception as e:
        print("错误：", e)
